package collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**增强型for循环,jdk1.5推出的新特性
 * 可以让我们用相同的语法遍历集合或数组
 * for(类型  变量名 : 集合或数组){
 *     ...
 * }*/
public class NewForDemo {
    public static void main(String[] args) {
        String[] str = {"one","two","three","four"};
        for (String s : str) {
            System.out.println(s);
        }
        System.out.println("==============");
        /*后面单指定泛型无意义
        * Collection<E>
        JDK5之后推出的另一个特性:泛型
            泛型也称为参数化类型,允许我们在使用一个类时,传入某个类型来规定其内部的属性,方法的参数或
            方法返回值的类型,使得我们使用时更加方便.
            在集合中泛型被广泛使用,用于规定集合中的元素类型.
            * 泛型的原型为Object,编译器认可
            * 赋值操作是,编译器会检查类型是否匹配,不匹配会编译不通过
            * 获取泛型的值时,编译器会自动补充造型操作*/
        Collection<String> c = new ArrayList<>();
        c.add("one");
        c.add("two");
        c.add("three");
//        c.add(123) //编译不通过,实参类型违背了当前集合指定的泛型E的实际类型String
        Iterator<String> iterator = c.iterator();//迭代器制定的泛型应当与其遍历的集合泛型一致
        while (iterator.hasNext()){
//            String s = (String) iterator.next();
            String s = iterator.next();//指定泛型后,获取元素无需在手动造型
            System.out.println(s);
        }
        /*test*/

        Collection<String> strings = new ArrayList<>();
        strings.add("123");
        //新循环遍历集合会被编译器改回成迭代器   无法删
        for (String obj : c){//集合指定泛型后,可以直接用元素类型接收元素,编译器会补充造型操作,如上↑↑
            c.addAll(strings);
            System.out.println(obj);
        }
        System.out.println(c);
        StringBuilder s = new StringBuilder("jejjej");
        fn(s);
        System.out.println(s);
    }
    static void fn(StringBuilder s){
        s = s.append(4);
    }
}
